﻿using System;
using System.Collections.Generic;
using System.Linq;
using ProjetoSolo.QueroGas.Dominio.Entidades;
using ProjetoSolo.QueroGas.Dominio.Repositorios;
using ProjetoSolo.QueroGas.Infraestrutura.PersistenciaAdo;
using ProjetoSolo.QueroGas.Infraestrutura.PersistenciaAdo.Repositorios;
using ProjetoSolo.QueroGas.Infraestrutura.Validacao;

namespace ProjetoSolo.QueroGas.Aplicacao.Servicos
{
    public static class ServicoEmpresa
    {
        public static IEnumerable<Empresa> ListarEmpresas()
        {
            using (IContextoRepositorio contexto = new ContextoAdo("QueroGas"))
            {
                IRepositorioEmpresa repositorio = new RepositorioEmpresa(contexto);
                return repositorio.PegarListaCompleta();
            }
        }

        public static void Cadastrar(Empresa empresa, int idUsuario)
        {
            RegraValidacao.VerificarObjetoNulo(empresa, "A empresa deve ser informada");
            RegraValidacao.VerificarValorZerado(idUsuario, "O codigo do usuario informado não é válido");

            using (IContextoRepositorio contexto = new ContextoAdo("QueroGas"))
            {
                try
                {
                    IRepositorioUsuario repositorioUsuario  = new RepositorioUsuario(contexto);
                    Usuario usuario = repositorioUsuario.PegarPorCodigo(idUsuario);

                    if(usuario == null)
                        throw new Exception("O usuário informado para o cadastro da empresa não foi encontrado.");

                    empresa.Usuario = usuario;

                    empresa.Validar();

                    if (EmpresaJahExiste(empresa))
                        throw new Exception("Já existe uma empresa cadastrada no mesmo local informado.");

                    IRepositorioEmpresa repositorioEmpresa = new RepositorioEmpresa(contexto);
                    repositorioEmpresa.Cadastrar(empresa);

                    contexto.PersistirAlteracoes();
                }
                catch (Exception)
                {
                    contexto.DescartarAlteracoes();
                    throw;
                }
            }
        }

        public static Empresa BuscarEmpresaPorCodigo(int codigoEmpresa)
        {
            RegraValidacao.VerificarValorZerado(codigoEmpresa, "O parametro codigoEmpresa é obrigatório.");

            using (IContextoRepositorio contexto = new ContextoAdo("QueroGas"))
            {
                IRepositorioEmpresa repositorio = new RepositorioEmpresa(contexto);
                return repositorio.PegarPorCodigo(codigoEmpresa);
            }
        }

        public static IEnumerable<Empresa> BuscarEmpresasPorEndereco(string estado, string cidade, string bairro)
        {
            RegraValidacao.VerificarObjetoNulo(estado, "O parametro estado é obrigatório");

            using (IContextoRepositorio contexto = new ContextoAdo("QueroGas"))
            {
                IRepositorioEmpresa repositorio = new RepositorioEmpresa(contexto);
                return repositorio.BuscarPorEndereco(new Endereco("", estado, cidade, bairro, "", "", 1, 1));                
            }
        }

        public static bool EmpresaJahExiste(Empresa empresa)
        {
            using (IContextoRepositorio contexto = new ContextoAdo("QueroGas"))
            {
                IRepositorioEmpresa repositorioEmpresa = new RepositorioEmpresa(contexto);
                
                if (EmpresaJahExiste(empresa, repositorioEmpresa))
                    return true;
            }
            
            return false;
        }

        private static bool EmpresaJahExiste(Empresa empresa, IRepositorioEmpresa repositorioEmpresa)
        {
            return repositorioEmpresa.BuscarPorEndereco(empresa.Endereco).Any();
        }
    }
}
